﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
using System.Web.Script.Serialization;
using GenesiModel;

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class GenesiServices
{
    // Per utilizzare HTTP GET, aggiungere l'attributo [WebGet]. (ResponseFormat predefinito è WebMessageFormat.Json)
    // Per creare un'operazione che restituisca XML,
    //     aggiungere [WebGet(ResponseFormat=WebMessageFormat.Xml)],
    //     e includere la riga seguente nel corpo dell'operazione:
    //         WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
    GenesiEntities dbContext = new GenesiEntities();
    // Per utilizzare HTTP GET, aggiungere l'attributo [WebGet]. (ResponseFormat predefinito è WebMessageFormat.Json)
    // Per creare un'operazione che restituisca XML,
    //     aggiungere [WebGet(ResponseFormat=WebMessageFormat.Xml)],
    //     e includere la riga seguente nel corpo dell'operazione:
    //         WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";


    [OperationContract]
    public string GetArticoli(string idFornitore)
    {
        List<Articoli> oLista = new List<Articoli>();
        var oList = dbContext.Articoli.ToList()
                .Where(a => a.IdFornitore == (string.IsNullOrEmpty(idFornitore) ? a.IdFornitore : int.Parse(idFornitore)))
                .Select(a => new { a.id, a.CodArt, a.descrizione }).ToList();

        JavaScriptSerializer oSerializer = new JavaScriptSerializer();
        string sJSON = oSerializer.Serialize(oList);
        return sJSON;
    }

    [OperationContract]
    public string GetArticoliFilters(string idFornitore, string idArticolo)
    {
        List<Articoli> result = new List<Articoli>();
        var olist = dbContext.Articoli.ToList()
                .Where(a => a.IdFornitore == (string.IsNullOrEmpty(idFornitore) ? a.IdFornitore : int.Parse(idFornitore)) &&
                            a.id == (string.IsNullOrEmpty(idArticolo) ? a.id : int.Parse(idArticolo)))
                            .Select(a => new { a.id, a.IdFornitore, a.CodArt, a.descrizione, a.Iva, a.PrezzoUnitario, DescUnitaMisura = a.UnitaMisura1.Descrizione }).ToList();

        //return result;
        JavaScriptSerializer oSerializer = new JavaScriptSerializer();
        string sJSON = oSerializer.Serialize(olist);
        return sJSON;
    }

    [OperationContract]
    public string GetFornitori()
    {
        var oList = dbContext.Fornitori.Select(f => new { f.id, f.CodForn, f.Fornitore }).ToList();
        JavaScriptSerializer oSerializer = new JavaScriptSerializer();
        string sJSON = oSerializer.Serialize(oList);
        return sJSON;
    }

    [OperationContract]
    public string GetModelli(int idUtente)
    {
        var oList = dbContext.TestataModelli.Where(t => t.IdUtente == idUtente).ToList();
        JavaScriptSerializer oSerializer = new JavaScriptSerializer();
        string sJSON = oSerializer.Serialize(oList);
        return sJSON;
    }

    public List<Articoli> GetArticoliList(int idFornitore)
    {
        List<Articoli> oLista = new List<Articoli>();
        var oList = dbContext.Articoli.ToList()
                .Where(a => a.IdFornitore == (idFornitore == 0 ? a.IdFornitore : idFornitore))
                .ToList();
        return oList;
    }

    public List<Articoli> CercaArticoli(string idFornitore, string idArticolo)
    {
        List<Articoli> result = new List<Articoli>();
        var olist = dbContext.Articoli.ToList()
                .Where(a => a.IdFornitore == (int.Parse(idFornitore) == 0 ? a.IdFornitore : int.Parse(idFornitore)) &&
                            a.id == (int.Parse(idArticolo) == 0 ? a.id : int.Parse(idArticolo)))
                            .ToList();
        return olist;
    }

    public Articoli Articolo(int id)
    {
        return dbContext.Articoli.Where(a => a.id == id).SingleOrDefault();
    }

    public List<Fornitori> GetFornitoriList()
    {
        return dbContext.Fornitori.ToList();
    }

    public List<TestataModelli> GetListaModelli(int idUtente)
    {
        return dbContext.TestataModelli.Where(t => t.IdUtente == idUtente).ToList();
    }

    public List<TestataModelli> GetTestataModelli(int idUtente)
    {
        return dbContext.TestataModelli.Where(t => t.IdUtente == idUtente).ToList();
    }

    public TestataModelli GetModello(int id, int idUtente)
    {
        return dbContext.TestataModelli.Where(t => t.id == id && t.IdUtente == idUtente).SingleOrDefault();
    }

    public void AddModello(NuovaTestataModello t, List<ComposizioneModelli> elenco)
    {
        var testa = new TestataModelli();
        testa.Descrizione = t.Descrizione;
        testa.Nome = t.Nome;
        testa.IdUtente = t.idUtente;
        testa.dataCreazione = DateTime.Now;

        dbContext.AddToTestataModelli(testa);
        foreach (ComposizioneModelli item in elenco)
        {
            var dett = new DettaglioModello();
            dett.IdArticolo = item.idarticolo;
            dett.Qta = item.qta;
            dett.IdTestata = testa.id;
            dbContext.AddToDettaglioModello(dett);
        };


        dbContext.SaveChanges();
    }

    public void DeleteModello(int id)
    {
        TestataModelli testa = dbContext.TestataModelli.Where(t => t.id == id).SingleOrDefault();
        if (testa != null)
        {
            var todelete = dbContext.DettaglioModello.Where(d => d.IdTestata == id);
            foreach (var item in todelete)
            {
                dbContext.DettaglioModello.DeleteObject(item);
            }
            dbContext.TestataModelli.DeleteObject(testa);
            dbContext.SaveChanges();
        }
    }

    public void UpdateModello(TestataModelli tm, List<Associato> Composizione)
    {
        TestataModelli testa = dbContext.TestataModelli.Where(t => t.id == tm.id).SingleOrDefault();
        if (testa != null)
        {
            testa.Descrizione = tm.Descrizione;
            testa.Nome = tm.Nome;

            var todelete = dbContext.DettaglioModello.Where(d => d.IdTestata == tm.id);
            foreach (var item in todelete)
            {
                dbContext.DettaglioModello.DeleteObject(item);
            }

            foreach (var item in Composizione.Where(i => i.Qta > 0))
            {
                var dett = new DettaglioModello();
                dett.IdArticolo = item.art.id;
                dett.Qta = item.Qta;
                dett.IdTestata = testa.id;
                dbContext.AddToDettaglioModello(dett);
            }

            dbContext.SaveChanges();
        }
    }

    public void OrderFromTemplate(int idTestataModello, string descrizione,string nome)
    {
        var modello = dbContext.TestataModelli.Where(t => t.id == idTestataModello).SingleOrDefault();
        if (modello != null)
        {
            Ordini o = new Ordini
            {
                DataOrdine = DateTime.Now,
                Descrizione = descrizione ?? modello.Descrizione,
                Nome = nome?? modello.Nome,
                Eliminato = false,
                IdUtente = modello.IdUtente,
                SpedizioneID = -1, //non gestito
                Stato = 0
            };
            //dbContext.Ordini.AddObject(o);
            foreach (var item in modello.DettaglioModello)
            {
                o.DettaglioOrdine.Add(new DettaglioOrdine
                {
                    IdArticolo = item.IdArticolo,
                    IdOrdine = o.id,
                    Quantita = item.Qta
                });
            }

            dbContext.Ordini.AddObject(o);
            dbContext.SaveChanges();
        }
    }

    public void OrderFromComposition(int IdUtente, string descrizione,string nome, List<ComposizioneOrdine> elenco)
    {
        Ordini o = new Ordini
        {
            DataOrdine = DateTime.Now,
            Descrizione = descrizione,
            Nome = nome,
            Eliminato = false,
            IdUtente = IdUtente,
            SpedizioneID = -1, //non gestito
            Stato = 0
        };
        //dbContext.Ordini.AddObject(o);
        foreach (var item in elenco)
        {
            o.DettaglioOrdine.Add(new DettaglioOrdine
            {
                IdArticolo = item.idarticolo,
                IdOrdine = o.id,
                Quantita = item.qta,
                PrezzoUnitario = item.prezzoUnitario
            });
        }

        dbContext.Ordini.AddObject(o);
        dbContext.SaveChanges();

    }
}


public class NuovaTestataModello
{
    public string Nome { get; set; }
    public string Descrizione { get; set; }
    public int idUtente { get; set; }
}
public class ComposizioneModelli
{
    public int idarticolo { get; set; }
    public int qta { get; set; }
}
public class ComposizioneOrdine
{
    public int idarticolo { get; set; }
    public int qta { get; set; }
    public decimal prezzoUnitario { get; set; }
}


public class Associato
{
    public Articoli art { get; set; }
    public int Qta { get; set; }
}